// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store'
import iView from 'iview'
import i18n from '@/locale'
import config from '@/config'
import importDirective from '@/directive'
import { directive as clickOutside } from 'v-click-outside-x'
import installPlugin from '@/plugin'
import '@/assets/icons/iconfont.css'
import TreeTable from 'tree-table-vue'
import jsonrpc from '@/libs/jsonrpc'
import VOrgTree from 'v-org-tree'
import 'v-org-tree/dist/v-org-tree.css'
import './index.less'
import CKEditor from '@ckeditor/ckeditor5-vue2'
// 实际打包时应该不引入mock
/* eslint-disable */
// if (process.env.NODE_ENV !== 'production') require('@/mock')


Vue.use( CKEditor );

Vue.use(iView, {
  i18n: (key, value) => i18n.t(key, value)
})
Vue.use(TreeTable)
Vue.use(VOrgTree)

Vue.use({
  install: function(vue) {

    var buildProxy = function(name, context) {
      return new Proxy(function() {
        var args = Array.prototype.slice.call(arguments, 0);
        return new Promise(function(resolve, reject) {

          jsonrpc(context.join("@") + "." + name, args, function(error, result) {
            if (error) {
              reject(error);
            } else {
              resolve(result);
            }
          });

        })
      }, {
        get: function(target, method) {
          if (!target[method]) {
            target[method] = buildProxy(method, context.concat([name]));
          }
          return target[method];
        }
      })
    }
    Vue.prototype.jsonrpc = new Proxy({}, {
      get: function(target, domain) {
        if (!target[domain]) {
          target[domain] = new Proxy({}, {
            get: function(subTarget, method) {
              if (["bind", "length", "name"].indexOf(method) < 0) {
                if (!subTarget[method]) {
                  subTarget[method] = buildProxy(method, [domain]);
                }
                return subTarget[method];
              } else {
                return subTarget[method];
              }
            }
          })
        }
        return target[domain];
      }
    })
  }
})
/**
 * @description 注册admin内置插件
 */
installPlugin(Vue)
/**
 * @description 生产环境关掉提示
 */
Vue.config.productionTip = false
/**
 * @description 全局注册应用配置
 */
Vue.prototype.$config = config
/**
 * 注册指令
 */
importDirective(Vue)
Vue.directive('clickOutside', clickOutside)

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  i18n,
  store,
  render: h => h(App)
})

window.jsonrpc = jsonrpc